
#include <gtest/gtest.h>
#include <iostream>
#include <hfsme/HEvent.h>
#include <hfsme/HState.h>
#include <hfsme/HStateMachine.h>

using namespace HFSME;

struct MyStateMachine:HStateMachine<MyStateMachine>
{

};


struct EventA:HEvent<EventA>
{

};
struct EventB:HEvent<EventB>
{

};

struct State1:HState<State1,MyStateMachine>
{
	State1()
	{
		register_handler<EventA,&State1::handlerA>();
	}
	void handlerA(const EventA & evt)
	{
		std::cout << "A called" << std::endl;
	}
	void handlerB(const EventB & evt)
	{
		std::cout << "B called" << std::endl;
	}

};

TEST(LocalDispatch,SimpleTest)
{
	State1 s1;

	s1.local_entry();
//
//	ASSERT_EQ(0,EventA::theEventTypeId);
//	ASSERT_EQ(1,EventB::theEventTypeId);
//
//	//test polymorphic event id
//	EventA a;
//	EventB b;
//	HEventBase *a_base=&a;
//	HEventBase *b_base=&b;
//	ASSERT_EQ(0,a_base->getEventTypeId());
//	ASSERT_EQ(1,b_base->getEventTypeId());
//
//	s1.local_dispatch(0,0);
//	s1.local_dispatch(1,0);


}

//
//template <typename T>
//struct Counter{
//	static int& getCounter(){
//		static int cntr=0;
//		return cntr;
//	}
//};
//struct A
//{
//	Counter<A> c;
//};
//struct B
//{
//	Counter<B> c;
//};
//
//
//
//TEST(LocalDispatch,Index)
//{
//	A a;
//	A a2;
//	B b;
//
//	a.c.getCounter()=2;
//	b.c.getCounter()=3;
//	std::cout << " A counter "<< a.c.getCounter() << std::endl;
//	std::cout << " A2 counter "<< a2.c.getCounter() << std::endl;
//	std::cout << " B counter "<< b.c.getCounter() << std::endl;
//}
//
//

int main(int argc, char **argv) {
  ::testing::InitGoogleTest(&argc, argv);
  return RUN_ALL_TESTS();
}







